/*
 * Copyright 2002-2011 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.core.convert.support;

import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.converter.ConverterRegistry;

/**
 * <p>
 * 1. ConverterRegistry
 * 		功能
 * 			注册转换器：ConverterRegistry 接口定义了添加和移除转换器的方法，允许应用程序动态地管理可用的转换逻辑。
 * 			内部使用：它是 ConversionService 的一部分，通常不直接由开发者调用，而是通过 ConversionService 来间接操作。
 * 		使用场景
 * 			自定义转换逻辑：当需要实现特定业务逻辑所需的数据类型转换时，可以将自定义的 Converter 或 GenericConverter 注册到 ConverterRegistry 中。
 * 2. ConversionService
 *		功能
 * 			统一转换接口：ConversionService 提供了一个高级别的 API，用于在任意两个类型之间进行安全且一致的转换。它封装了所有底层的转换逻辑，并提供了对转换过程的集中管理。
 * 			支持多种转换器：它可以利用 Converter、GenericConverter、Parser 和 Printer 来完成从简单到复杂的类型转换任务。
 * 			集成其他组件：ConversionService 可以很容易地与其他 Spring 组件集成，如数据绑定、验证框架等。
 * 		使用场景
 * 			跨层转换：在不同的应用层之间（如 Web 层和服务层）传递数据时，确保数据类型的一致性和正确性。
 * 			自动装配：Spring Boot 默认会创建并配置一个 ConversionService 实例，因此大多数情况下可以直接注入使用，无需手动实例化。
 *
 * 		示例代码
 * 		import org.springframework.context.annotation.Bean;
 * 		import org.springframework.core.convert.ConversionService;
 * 		import org.springframework.format.support.FormattingConversionService;
 * 		@Configuration
 * 		public class AppConfig {
 *     		@Bean
 *     		public ConversionService conversionService() {
 *         		FormattingConversionService conversionService = new FormattingConversionService();
 *         		// 注册自定义转换器
 *        		 conversionService.addConverter(new StringToIntegerConverter());
 *        		 return conversionService;
 *     		}
 * 		}
 * 3. 与 Parser、Printer、Converter 和 GenericConverter 的关系
 * 		Parser 和 Printer：虽然 Parser 和 Printer 主要关注字符串和其他类型之间的转换，但它们也可以作为 ConversionService 的一部分来处理特定的输入输出格式化需求。例如，在处理表单提交或命令行参数时，Parser 可以用来解析用户输入，而 Printer 则负责生成适合显示的字符串表示。
 * 		Converter 和 GenericConverter：这两种转换器是 ConversionService 的核心组成部分，提供了具体类型的转换逻辑。Converter 适用于简单的、一对一的转换，而 GenericConverter 则提供了更灵活的支持，能够处理多对多的复杂转换场景。
 *
 * 4. 比较分析
 * 		特性				ConverterRegistry			ConversionService	Parser/Printer				Converter/GenericConverter
 * 		主要用途			管理转换器的注册和注销			提供统一的类型转换服务	字符串与其他类型的解析和格式化	实现具体的类型转换逻辑
 * 		适用范围			内部使用，不直接暴露给开发者		应用程序级别的类型转换	输入输出操作					类型转换的具体实现
 * 		灵活性			高，支持动态管理转换器			高，统一管理和执行转换	较低，专注于字符串转换			中等到高，取决于具体实现
 * 		复杂度			适中							适中					适中							从低到高，取决于转换逻辑的复杂程度
 * 		是否考虑国际化	不直接涉及					支持国际化			支持（通过 Locale 参数）		不直接涉及
 *
 * 5. 总结
 * 		ConverterRegistry：主要用于内部管理转换器的注册和注销，通常不需要开发者直接与其交互。它是 ConversionService 的一部分，确保了转换逻辑的集中管理和灵活性。
 * 		ConversionService：提供了一个高层次的 API 来执行类型转换，使得不同类型的对象可以在整个应用程序中无缝地传递。它整合了 Parser、Printer、Converter 和 GenericConverter 的功能，为开发者提供了一个强大而灵活的工具。
 * 		Parser 和 Printer：专门用于处理字符串与其他类型之间的转换，特别是在输入输出操作中非常有用。它们考虑了国际化的需求，因此非常适合处理多语言环境下的应用。
 * 		Converter 和 GenericConverter：实现了具体的类型转换逻辑，其中 Converter 适用于简单的、一对一的转换，而 GenericConverter 提供了更多的灵活性来处理复杂的转换场景。
 * </p>
 * Configuration interface to be implemented by most if not all {@link ConversionService}
 * types. Consolidates the read-only operations exposed by {@link ConversionService} and
 * the mutating operations of {@link ConverterRegistry} to allow for convenient ad-hoc
 * addition and removal of {@link org.springframework.core.convert.converter.Converter
 * Converters} through. The latter is particularly useful when working against a
 * {@link org.springframework.core.env.ConfigurableEnvironment ConfigurableEnvironment}
 * instance in application context bootstrapping code.
 *
 * @author Chris Beams
 * @since 3.1
 * @see org.springframework.core.env.ConfigurablePropertyResolver#getConversionService()
 * @see org.springframework.core.env.ConfigurableEnvironment
 * @see org.springframework.context.ConfigurableApplicationContext#getEnvironment()
 */
public interface ConfigurableConversionService extends ConversionService, ConverterRegistry {

}
